/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package servlet;

import conexion.HibSession;
import ejb.CtrSession;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import org.hibernate.Session;
import utils.ClaseGeneral;
import utils.FacesUtils;
import utils.GeneraReporte;

@WebServlet("/pdfServlet")
public class pdfServlet extends HttpServlet {

    CtrSession ctrSession;

    // This method is called by the servlet container to process a GET request.
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        doGetOrPost(req, resp);
    }

    // This method is called by the servlet container to process a POST request.
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        doGetOrPost(req, resp);
    }

    private void doGetOrPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // Get the value of a request parameter; the name is case-sensitive

        String reporteNombre = req.getParameter("reporteNombre");

        if (reporteNombre.equals("reporte_Proyecto")) {

            //Saco la fecha inicial:
            Date fecha = new Date();
            Calendar cal = Calendar.getInstance();
            cal.setTime(fecha);
            cal.set(Calendar.DAY_OF_MONTH, 1);
            Date fechaInicial = new Date();
            fechaInicial = new java.util.Date(cal.getTimeInMillis());

            //Saco los parametros del reporte:
            String nombreProyecto = req.getParameter("nombreProyecto");
            int proyectoId = Integer.valueOf(req.getParameter("proyectoId"));
            int usuarioId = Integer.valueOf(req.getParameter("usuarioId"));

            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            Map parametros = new HashMap();

            parametros.put("logo", ctrSession.getLogo());
            parametros.put("principalFecha", fechaInicial);
            parametros.put("nombreProyecto", nombreProyecto);
            parametros.put("proyectoId", proyectoId);
            parametros.put("usuarioId", usuarioId);

            //Genero el pdf:
            generaPdfMismaPagina(reporteNombre, parametros, "reporte_estadistico");
            

        }
        
        //Reportes de Analisis de Información de Defectos
        if (reporteNombre.equals("reporte_Analisis1")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, null, "reporte_Analisis");
            
        }

         //Reportes de Analisis de Sintomas
        if (reporteNombre.equals("reporteAnalisis_Sintomas")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            ctrSession.getParametrosReporte().put("logo", ctrSession.getLogo());
            //El listado de datos es tomado del bean de session.
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, ctrSession.getParametrosReporte(), "reporte_Analisis_Sintomas");
            
        }
        
         //Reportes de Analisis de Aspectos
        if (reporteNombre.equals("reporteAnalisis_Aspectos")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            ctrSession.getParametrosReporte().put("logo", ctrSession.getLogo());
            //El listado de datos es tomado del bean de session.
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, ctrSession.getParametrosReporte(), "reporte_Analisis_Aspectos");
            
        }
        
        //Reportes del Nivel de Diagrama
        if (reporteNombre.equals("reporteAnalisis_Nivel")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            ctrSession.getParametrosReporte().put("logo", ctrSession.getLogo());
            //El listado de datos es tomado del bean de session.
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, ctrSession.getParametrosReporte(), "reporte_Analisis_Nivel");
            
        }
                
        //Reportes del Localizacion del Diagrama
        if (reporteNombre.equals("reporteAnalisis_Localizacion")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            ctrSession.getParametrosReporte().put("logo", ctrSession.getLogo());
            //El listado de datos es tomado del bean de session.
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, ctrSession.getParametrosReporte(), "reporte_Analisis_Localizacion");
            
        }
        
        //Reportes del Localizacion del Diagrama
        if (reporteNombre.equals("reporteAnalisis_Prioridad")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            ctrSession.getParametrosReporte().put("logo", ctrSession.getLogo());
            //El listado de datos es tomado del bean de session.
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, ctrSession.getParametrosReporte(), "reporte_Analisis_Prioridad");
            
        }
        
        //Reportes por Severidad
        if (reporteNombre.equals("reporteAnalisis_Severidad")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            ctrSession.getParametrosReporte().put("logo", ctrSession.getLogo());
            //El listado de datos es tomado del bean de session.
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, ctrSession.getParametrosReporte(), "reporte_Analisis_Severidad");
            
        }
        
        //Reportes por Tipo de Vista
        if (reporteNombre.equals("reporteAnalisis_Vista")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            ctrSession.getParametrosReporte().put("logo", ctrSession.getLogo());
            //El listado de datos es tomado del bean de session.
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, ctrSession.getParametrosReporte(), "reporte_Analisis_Vista");
            
        }
        
        //Reportes por Categoria
        if (reporteNombre.equals("reporteAnalisis_Categoria")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            ctrSession.getParametrosReporte().put("logo", ctrSession.getLogo());
            //El listado de datos es tomado del bean de session.
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, ctrSession.getParametrosReporte(), "reporte_Analisis_Categoria");
            
        }
        
        //Reportes por Tecnica de Detección
        if (reporteNombre.equals("reporteAnalisis_Tecnica")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            ctrSession.getParametrosReporte().put("logo", ctrSession.getLogo());
            //El listado de datos es tomado del bean de session.
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, ctrSession.getParametrosReporte(), "reporte_Analisis_Técnica");
            
        }
        
        
         //Reportes por Naturaleza de la Tecnica
        if (reporteNombre.equals("reporteAnalisis_Naturaleza")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            ctrSession.getParametrosReporte().put("logo", ctrSession.getLogo());
            //El listado de datos es tomado del bean de session.
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, ctrSession.getParametrosReporte(), "reporte_Analisis_Naturaleza");
            
        }
        
          //Reportes por Proposito de la Técnica
        if (reporteNombre.equals("reporteAnalisis_Proposito")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            ctrSession.getParametrosReporte().put("logo", ctrSession.getLogo());
            //El listado de datos es tomado del bean de session.
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, ctrSession.getParametrosReporte(), "reporte_Analisis_Proposito");
            
        }
        
        
        
      //Reportes por Herramienta de Soporte
        if (reporteNombre.equals("reporteAnalisis_Herramienta")) {
            ctrSession = (CtrSession) FacesUtils.getManagedBean("ctrSession");
            ctrSession.getParametrosReporte().put("logo", ctrSession.getLogo());
            //El listado de datos es tomado del bean de session.
            List<ClaseGeneral> listaDatos=(List)ctrSession.getReporteData();
            generaPdfListadoMismaPagina(listaDatos,reporteNombre,  ClaseGeneral.class, ctrSession.getParametrosReporte(), "reporte_Analisis_Herramienta");
            
        }
        
        

    }

    public void generaPdfMismaPagina(String nombreReporte, Map parametrosReporte, String nombreReporteGenerar) {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        OutputStream out = null;
        Session con = null;

        try {
            con = HibSession.abrirSesion();
            JasperReport jasperReport = null;
            try {
                String archivo = FacesUtils.getExternalContext().getRealPath("/resources/reportes/" + nombreReporte + ".jasper");
                jasperReport = (JasperReport) JRLoader.loadObject(archivo);

            } catch (JRException e) {
                e.printStackTrace();
            }

            byte[] fichero = JasperRunManager.runReportToPdf(jasperReport, parametrosReporte, con.connection());
            response.setContentType("application / pdf");
            response.setHeader("Content - disposition", "inline;filename = "+nombreReporteGenerar+".pdf");
            response.setHeader("Cache - Control", "max - age = 30");
            response.setHeader("Pragma", "No - cache");
            response.setDateHeader("Expires", 0);
            response.setContentLength(fichero.length);
            out = response.getOutputStream();

            out.write(fichero, 0, fichero.length);
            out.flush();
            out.close();
        } catch (JRException ex) {
            Logger.getLogger(GeneraReporte.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (Exception eq) {
            eq.printStackTrace();
        } finally {
            HibSession.cerrarSesion();
        }

        context.responseComplete();
    }
    
    
     public void generaPdfListadoMismaPagina(List lstDatos, String nombreReporte, Class clase, Map parametrosReporte, String nombreReporteGenerar) {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
        OutputStream out = null;
        

        try {
        
            JasperReport jasperReport = null;
            
            JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(lstDatos);
            
            try {
                String archivo = FacesUtils.getExternalContext().getRealPath("/resources/reportes/" + nombreReporte + ".jasper");
                jasperReport = (JasperReport) JRLoader.loadObject(archivo);

            } catch (JRException e) {
                e.printStackTrace();
            }

            byte[] fichero = JasperRunManager.runReportToPdf(jasperReport, parametrosReporte, ds);
            response.setContentType("application / pdf");
            response.setHeader("Content - disposition", "inline;filename = "+nombreReporteGenerar+".pdf");
            response.setHeader("Cache - Control", "max - age = 30");
            response.setHeader("Pragma", "No - cache");
            response.setDateHeader("Expires", 0);
            response.setContentLength(fichero.length);
            out = response.getOutputStream();

            out.write(fichero, 0, fichero.length);
            out.flush();
            out.close();
        } catch (JRException ex) {
            Logger.getLogger(GeneraReporte.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (Exception eq) {
            eq.printStackTrace();
        } finally {
            HibSession.cerrarSesion();
        }

        context.responseComplete();
    }
    
    
    
    
    public void generaPdfComoDescarga(String nombreReporte, Map parametrosReporte, String nombreReporteGenerar,HttpServletRequest req, HttpServletResponse resp) {


        OutputStream out = null;
        Session con = null;

        try {
            con = HibSession.abrirSesion();
            JasperReport jasperReport = null;
            try {
                String archivo = FacesUtils.getExternalContext().getRealPath("/resources/reportes/" + nombreReporte + ".jasper");
                jasperReport = (JasperReport) JRLoader.loadObject(archivo);

            } catch (JRException e) {
                e.printStackTrace();
            }

            ByteArrayInputStream fichero = null;
            fichero = new ByteArrayInputStream(JasperRunManager.runReportToPdf(jasperReport, parametrosReporte, con.connection()));
            resp.setContentType("application/pdf");
            resp.setHeader("Content-disposition", "inline; filename="
                    + nombreReporteGenerar + ".pdf");
            resp.setHeader("Cache-Control", "max-age=30");
            resp.setHeader("Pragma", "No-cache");
            resp.setDateHeader("Expires", 0);

            out = resp.getOutputStream();

            //Escribir en bloques y no todo el contenido
            byte[] buf = new byte[1024];
            int len;
            while ((len = fichero.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            fichero.close();
            out.flush();
            out.close();
        } catch (JRException ex) {
            Logger.getLogger(GeneraReporte.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (Exception eq) {
            eq.printStackTrace();
        } finally {
            HibSession.cerrarSesion();
        }

    }
    
    
     public void generaPdfListadoComoDescarga(List lstDatos, String nombreReporte, Class clase, Map parametrosReporte, String nombreReporteGenerar) {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();

        JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(lstDatos);

        OutputStream out = null;

        try {

            JasperReport jasperReport = null;
            try {
                String archivo = FacesUtils.getExternalContext().getRealPath("/resources/reportes/" + nombreReporte + ".jasper");
                jasperReport = (JasperReport) JRLoader.loadObject(archivo);

            } catch (JRException e) {
                e.printStackTrace();
            }

            ByteArrayInputStream fichero = null;
            fichero = new ByteArrayInputStream(JasperRunManager.runReportToPdf(jasperReport, parametrosReporte, ds));
            response.setContentType("application/vnd.ms-pdf");
            response.setHeader("Content-disposition", "inline; filename="
                    + nombreReporteGenerar + ".pdf");
            response.setHeader("Cache-Control", "max-age=30");
            response.setHeader("Pragma", "No-cache");
            response.setDateHeader("Expires", 0);
            out = response.getOutputStream();
            //Escribir en bloques y no todo el contenido
            byte[] buf = new byte[1024];
            int len;
            while ((len = fichero.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            fichero.close();
            out.flush();
            out.close();
        } catch (JRException ex) {
            ex.printStackTrace();
            Logger.getLogger(GeneraReporte.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException e1) {
            e1.printStackTrace();
        } catch (Exception eq) {
            eq.printStackTrace();
        } finally {

        }

        context.responseComplete();
    }
    

}
